﻿
#include <algorithm>//用于排序
#include "zyRadioBox.h"

BlackMoonUI::zyRadioBox::zyRadioBox()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setChildWndProc(zyRadioBox_ChildWndProc);
	setType(zyType_RadioButton);
}
BlackMoonUI::zyRadioBox::~zyRadioBox()
{

}
LRESULT WINAPI BlackMoonUI::zyRadioBox::zyRadioBox_ChildWndProc(zyObject* obj, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL* bHandle)
{
	//std::cout << "zyCommandCtrol_ChildWndProcuMsg: "<< message << std::endl;
	if (message == WM_COMMAND)
	{
		short id = LOWORD(wParam);// & 65535); //LOWORD
		int code = HIWORD(wParam);
		if (code == BN_CLICKED) {
			// 自己实现选中单选框，为什么要这么做？因为发现一个奇怪问题，当 BS_AUTORADIOBUTTON 遇见其他窗口有 WS_EX_CONTROLPARENT 风格时，
			// 且 拥有WS_EX_CONTROLPARENT风格的窗口， 里面有子窗口，那么当点击单选框时，就会卡死，感觉进入一个死循环。 
			// 而且如果使用了Windows通用组件库6.0则无此问题
			if (lParam != 0 && SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == 0)  // 在没有选中的时候, 检查是否是单选框被点击且当前未选中
			{
				std::vector<int> groupids;
				HWND hWndRadio = FindWindowEx(hWnd, NULL, L"Button", nullptr);
				bool hasGroup = false;
				// 遍历所有子窗口，查找单选框
				while (hWndRadio != nullptr)
				{
					int style = (int)GetWindowLongPtr(hWndRadio, GWL_STYLE);
					// 检查是否是单选框
					if ((style & BS_RADIOBUTTON) == BS_RADIOBUTTON)
					{
						// 检查是否是组开始
						if ((style & WS_GROUP) == WS_GROUP)
						{
							// 检查当前ID是否已经在组中
							if (std::find(groupids.begin(), groupids.end(), id) != groupids.end())
							{
								hasGroup = true;
								break;
							}
							groupids.clear(); // 清空组ID列表
						}
						groupids.push_back(static_cast<int>(GetWindowLongPtr(hWndRadio, GWL_ID))); // 添加单选框ID到组
					}
					hWndRadio = FindWindowEx(hWnd, hWndRadio, L"Button", nullptr); // 查找下一个单选框
				}

				// 如果有单选框组，则选中对应的单选框
				if (!groupids.empty()){
					std::sort(groupids.begin(), groupids.end(), &zyRadioBox::zyRadioButtonComparer);
					CheckRadioButton(hWnd, groupids.front(), groupids.back(), id);
				}
			}
		}
	}
	return zyCommandCtrol::zyCommand_ChildWndProc(obj, hWnd, message, wParam, lParam, bHandle);
}
BOOL BlackMoonUI::zyRadioBox::zyRadioButtonComparer(int value1, int value2) {
	return value1 < value2; // 如果value1小于value2，返回true，意味着value1应该在value2之前
}
BOOL BlackMoonUI::zyRadioBox::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{

	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();

	return _CreateCtrol(参数_父窗口, 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 | BS_AUTORADIOBUTTON, 参数_扩展风格, L"Button");
}

BOOL BlackMoonUI::zyRadioBox::创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{

	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();

	return _CreateCtrol(参数_父窗口.getHwnd(), 参数_标题, 参数_位置, 参数_尺寸, 参数_ID, 参数_窗口风格 | BS_AUTORADIOBUTTON, 参数_扩展风格, L"Button");

}
BOOL BlackMoonUI::zyRadioBox::SetSel(BOOL ifSel) {
	if (!ifSel)
		return sendMsg(BM_GETCHECK, 0, 0) != 0;
	else
		return sendMsg(BM_SETCHECK, ifSel ? BST_CHECKED : BST_UNCHECKED, 0) != 0;
}